// 注: 此篇非完全为官方文档总结， 参考https://blog.csdn.net/z591102/article/details/120011068

// 断言的用途
// 避免在空对象内添加数据时报错
// 空对象添加数据
interface Obj1_A {
    name: string;
    age: number;
};

let Obj1_A = {} as Obj1_A;
Obj1_A.name = "小明";
// console.log(Obj1_A);

// 空对象添加数据 错误示范
// 因为 foo 的类型推断为 {}，即没有属性的对象。因此不能在它的属性上添加新属性
// let Obj1_B = {};
// Obj1_B.name = "小giaogiao";


// 参考文档： https://www.jianshu.com/p/c977b88807d2
// TS 类型断言定义：把两种 有重叠关系的 数据类型 进行相互转换，把其中一种数据类型 转换成 另外一种数据类型。
// 类型断言和类型转换产生的效果一样，但语法格式不同

// 重叠关系
// 1、如果 A，B 都是类并且有继承关系
// 无论 A，B 谁是父类或子类， A 的对象变量可以断言成 B 类型，B的对象变量可以断言成A类型。
// 如果 A，B 都是类，但没有继承关系
// 两个类中的任意一个类的所有的 public 实例属性【不包括静态属性】加上所有的 public实例方法 和
// 另一个类的所有public 实例属性加上所有的 public 实例方法完全相同或是另外一个类的子集
// 则这两个类可以相互断言。否则这两个类就不能相互断言
// 2、如果 A 是类，B 是接口，并且 A 类实现了 B 接口【implements】，则AB可相互断言
// 3、如果 A 是类，B 是接口，A 类没有实现 B接口，断言关系和第2项的规则完全相同
// 4、如果 A 是类，B 是 type 定义的数据类型【就是引用数据类型，例如 Array, 对象，不能是基本数据类型】
// 5、并且有 A 类实现了 B type 定义的数据类型【 implements】，则AB可相互断言
// 6、如果 A 是类，B 是 type 定义的数据类型，并且 A 类没有实现 B type定义的数据类型，断言关系和第2项的规则完全相同
// 7、如果 A 是一个函数上参数变量的联合类型，例如 string |number，那么在函数内部可以断言成 string 或number 类型
function strOrNum(value: string | number): number {
    return (value as number) + 20
}
console.log(strOrNum("3")) // 未报错但运算依旧为 "3" + 20 , 结果为320， 但若内部为乘法 则运算正常
// 8、任何数据类型都可以转换成 any 或 unknown 类型，any 或 unknown 类型也可以转换成任何其他数据类型。
